Який найшвидший спосіб перетворити java.nio.ByteBuffer a на (щойно створений) CharBuffer b або char [] b. Роблячи це, важливо, щоб a [i] == b [i]. Це означає, що не a [i] та a [i + 1] разом складають значення b [j], а те, що би робив getChar (i), але значення слід «розповсюджувати». байт a [] = {1,2,3, 125,126,127, -128, -127, -126} // кожен байт (які підписані) char b [] = {1,2,3, 125,126,127, 128, 129, 130} // кожен символ char (які не мають підпису) Зверніть увагу, що байт: -128 має ті самі (8 нижчих) бітів, що і char: 128. Тому я припускаю, що "найкраща" інтерпретація буде такою, як я зазначив вище, оскільки біти однакові. Після цього мені також потрібен переклад навпаки: Найефективніший спосіб повернути char [] або java.nio.CharBuffer назад у java.nio.ByteBuffer.
2021-01-06 08:20:05
Отже, що ви хочете, це конвертувати за допомогою кодування ISO-8859-1. Я нічого не стверджую щодо ефективності, але принаймні це досить коротко: Результат CharBuffer = Charset.forName ("ISO-8859-1"). Декодування (byteBuffer); Іншим напрямком буде: Результат ByteBuffer = Charset.forName ("ISO-8859-1"). Encode (charBuffer); Будь ласка, виміряйте це з іншими рішеннями. (Чесно кажучи, частину Charset.forName не слід включати, а також робити це лише один раз, а не для кожного буфера знову.) З Java 7 також існує клас StandardCharsets із попередньо інстанційованими екземплярами Charset, тому ви можете використовувати Результат CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer); і Результат ByteBuffer = StandardCharsets.ISO_8859_1.encode (charBuffer); замість цього. (Ці рядки виконують те саме, що і раніше, просто пошук простіший, і немає ризику неправильно вводити імена і не потрібно вловлювати неможливі винятки.) | Я б погодився з @ Ishtar's, пропоную взагалі уникати перетворення на нову структуру і конвертувати лише за потребою. Однак якщо у вас є купа ByteBuffer, ви можете це зробити. ByteBuffer bb = ... байт [] масив = bb.array (); char [] chars = новий char [bb.remaining ()]; for (int i = 0; i